package com.gitee.feizns.menu;

import com.gitee.feizns.menu.exception.NotEnumeratedException;

import java.util.Arrays;
import java.util.Set;
import java.util.TreeSet;
import java.util.stream.Collectors;

/**
 * 代表一个菜单或按钮
 * @author feizns
 * @since 2019/5/4 0004
 */
public interface Menu {

    /**
     * 获取菜单的唯一标识
     * @return
     */
    default int getId() {

        NotEnumeratedException.checkClassIsEnum(this.getClass());

        return ((Enum) this).ordinal();
    }

    /**
     * 获取父菜单
     * @return
     */
    default Menu getParent() {
        return null;
    }

    /**
     * 获取菜单中所有关联到的菜单项
     * @param menus
     * @return
     */
    static Set<Menu> getMenus(Menu... menus) {
        Set<Menu> result = new TreeSet<>();
        if ( menus != null ) {
            for (Menu menu : menus) {
                for (Menu tmp = menu; tmp != null; tmp = tmp.getParent()) {
                    result.add(tmp);
                }
            }
        }
        return result;
    }

    /**
     * 获取指定菜单的所有子菜单，menu的实现须是枚举类
     * @param menu
     * @return
     */
    static Set<Menu> getSubMenus(Menu menu) {

        Menu[] menus = getAll((Class<Menu>) menu.getClass());

        return Arrays.stream(menus)
                .filter(item -> item.getParent() == menu)
                .collect(Collectors.toSet());
    }

    /**
     * 获取所有的菜单.
     * @param clz
     * @return
     */
    static Menu[] getAll(Class<Menu> clz) {

        NotEnumeratedException.checkClassIsEnum(clz);

        return clz.getEnumConstants();
    }

}
